#include "elasticlient/client.h"
#include "logger.hpp"
#include "icsearch.hpp" // 包含你的功能实现头文件
#include <gflags/gflags.h>
#include <iostream>
#include <memory>

// 初始化命令行参数和日志标志
DEFINE_string(run_mode, "console", "运行模式：console 或 file");
DEFINE_string(log_file, "test.log", "日志文件路径");
DEFINE_string(log_level, "info", "日志级别：debug, info, warning, error");

int main(int argc, char *argv[]) {
    // 解析命令行参数
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 初始化日志系统
    init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);

    // 配置 Elasticsearch 地址
    std::vector<std::string> host_list = {"http://127.0.0.1:9200/"};
    auto client = std::make_shared<elasticlient::Client>(host_list);

    // 打印客户端指针地址（测试目的）
    std::cout << "Elasticsearch Client Initialized at: " << (uint64_t)client.get() << std::endl;

    // 测试 1: 索引创建
    {
        LOG_INFO("=== 测试索引创建 ===");
        bool ret = mag::ESIndex(client, "test_user", "_doc")
                       .append("nickname", "text", "ik_max_word", true)
                       .append("phone", "keyword", "standard", true)
                       .append("description", "text", "ik_max_word", false)
                       .create();
        if (ret) {
            LOG_INFO("索引创建成功");
        } else {
            LOG_ERROR("索引创建失败");
        }
    }

    // 测试 2: 数据插入
    {
        LOG_INFO("=== 测试数据插入 ===");
        bool ret = mag::ESInsert(client, "test_user", "_doc")
                       .append("nickname", "John Doe")
                       .append("phone", "123456789")
                       .append("description", "Test User for Elasticsearch")
                       .insert("1"); // ID 为 "1"
        if (ret) {
            LOG_INFO("数据插入成功");
        } else {
            LOG_ERROR("数据插入失败");
        }
    }

    // 测试 3: 数据搜索
    {
        LOG_INFO("=== 测试数据搜索 ===");
        mag::ESSearch searcher(client, "test_user", "_doc");
        searcher.append_must_match("nickname", "John Doe");
        Json::Value results = searcher.search();
        if (!results.empty()) {
            LOG_INFO("搜索成功，结果如下：\n{}", results.toStyledString());
        } else {
            LOG_ERROR("搜索失败");
        }
    }

    // 测试 4: 数据删除
    {
        LOG_INFO("=== 测试数据删除 ===");
        bool ret = mag::ESRemove(client, "test_user", "_doc").remove("1"); // 删除 ID 为 "1" 的数据
        if (ret) {
            LOG_INFO("数据删除成功");
        } else {
            LOG_ERROR("数据删除失败");
        }
    }

    return 0;
}
